/**
 * @file EuroConvertorBean.java
 * Projet eCOM 2010 (Miage Descartes)
 * @author Doido Sébastien
 * @version 2
 * @brief Bean relatif au traitement des conversions de devise
 */
package ecom.beans;

import java.util.Vector;
import javax.ejb.Remote;
import javax.ejb.Stateful;

/**
 * @brief Bean relatif au traitement des conversions de devise
 * @author Sebastien
 */
@Stateful 
@Remote(EuroConvertorRemote.class)
public class EuroConvertorBean implements java.io.Serializable, EuroConvertorRemote {

    /**
     * @brief Enumération des devises connues et des taux de conversion vers l'euro
     */
    public enum Currency {

        EUR ("Euro", 1.0),
        FRF ("FRF franc français", 6.55957),
        DEM ("DEM mark allemand", 1.95583),
        BEF ("BEF/LUF franc belge/lux.", 40.3399),
        USD ("USD dollar américain", 1.3353);

        private String name;
        private Double toEuro;

        Currency(String name, Double toEuro) {
            this.name = name;
            this.toEuro = toEuro;
        }

        /**
         * @brief Renvoie la devise par défault pour les programmes clients
         * @return
         */
        public static Currency getDefault() {
            return EUR;
        }

        /**
         * @brief Renvoie la devise connue (ou exception) pour une chaîne reçue
         * @param s : devise de type String
         * @return : devise de type currency
         * @throws java.lang.Exception : devise inconnue
         */
        public static Currency get(String s) throws Exception {
            for (Currency c : Currency.values()) {
                if (s.equals(String.valueOf(c))) {
                    return c;
                }
            }
            throw new Exception("Error : " + s + " is an unknown argument");
        }

        /**
         * @brief Renvoie le nom complet de la devise
         * @return le nom complet de la devise
         */
        public String getName() {
            return this.name;
        }

        /**
         * @brief Renvoie le taux de conversion vers l'euro pour la devise
         * @return le taux de conversion vers l'euro pour la devise
         */
        public Double getConversionRate() {
            return this.toEuro;
        }
    };

    /**
     * @brief Convertit un montant en euro vers un montant de devise X
     * @param amount : montant à convertir
     * @param currencySymbol : devise de destination
     * @return le montant converti
     */
	@Override
	public double convertFromEuro(double amount, String currencySymbol) {
        try {
            Currency c = Currency.get(currencySymbol);
            return amount * c.getConversionRate();
        } catch (Exception ex) {
            System.err.println("Unknown currency");
            return 0.0;
        }
	}

    /**
     * @brief Convertit un montant d'une devise vers un montant en euro
     * @param amount : montant à convertir
     * @param currencySymbol : devise d'origine
     * @return le montant converti
     */
	public double convertToEuro(double amount, String currencySymbol) {
        try {
            Currency c = Currency.get(currencySymbol);
            return amount / c.getConversionRate();
        } catch (Exception ex) {
            System.err.println("Unknown currency");
            return 0.0;
        }
    }

    /**
     * @brief Renvoie le nom complet d'une devise
     * @param currencySymbol : symbole devise
     * @return  le nom complet d'une devise
     * @throws java.lang.Exception : devise inconnue
     */
	@Override
	public String getCurrencyRealName(String currencySymbol) throws Exception {
		return Currency.get(currencySymbol).getName();
	}

    /**
     * @brief renvoie la liste des devises connues
     * @return la liste des devises connues
     */
	@Override
	public Vector<String> getCurrencySymbols() {
		Vector<String> symbols = new Vector<String>();
        for(Currency c : Currency.values()) {
            symbols.add(String.valueOf(c));
        }
        return symbols;
	}	
}
